package main

import (
	"bytes"
	"fmt"
	"image/color"
	"os"

	"github.com/fogleman/gg"
)

type Data struct {
	Label string
	Value float64
}

func main() {
	data := []Data{
		{"192.168.129.13", 1060.1},
		{"192.168.129.73", 59.3},
		{"192.168.129.24", 38.2},
		{"192.168.129.19", 22.7},
		{"192.168.129.16", 16.7},
		{"192.168.129.01", 1.2}, // 添加小值项
	}

	colors := []color.RGBA{
		{255, 99, 71, 255},   // 红色
		{255, 165, 0, 255},   // 橙色
		{30, 144, 255, 255},  // 蓝色
		{169, 169, 169, 255}, // 灰色
		{169, 169, 169, 255}, // 灰色
		{34, 139, 34, 255},   // 绿色
	}

	const (
		width       = 600
		height      = 200
		barHeight   = 20
		padding     = 10
		maxBarWidth = 400 // 设置最大柱宽，防止超出图表宽度
		minBarWidth = 50  // 设置最小柱宽，确保小值的柱子可见
	)

	dc := gg.NewContext(width, height)
	dc.SetColor(color.White)
	dc.Clear()

	// 计算数据中的最大值
	var maxValue float64
	for _, d := range data {
		if d.Value > maxValue {
			maxValue = d.Value
		}
	}

	// 计算缩放比例，确保最大值对应的柱宽不会超过最大柱宽
	scale := (maxBarWidth - minBarWidth) / maxValue

	// 计算柱子的总高度
	totalBarHeight := float64(len(data))*(barHeight+padding) - padding

	// 计算柱子的起始Y坐标，以垂直居中
	startY := (height - totalBarHeight) / 2

	// 绘制柱子和文字
	for i, d := range data {
		y := startY + float64(i)*(barHeight+padding)

		// 绘制带编号的圆形
		dc.SetColor(colors[i%len(colors)])
		dc.DrawCircle(20, y+barHeight/2, 10)
		dc.Fill()
		dc.SetColor(color.White)
		dc.DrawStringAnchored(fmt.Sprintf("%d", i+1), 20, y+barHeight/2, 0.5, 0.5)

		// 绘制标签
		dc.SetColor(color.Black)
		dc.DrawStringAnchored(d.Label, 50, y+barHeight/2, 0, 0.5)

		// 根据缩放比例计算柱宽，确保柱子不会小于最小柱宽
		barWidth := d.Value*scale + minBarWidth - 30
		dc.SetColor(colors[i%len(colors)])
		dc.DrawRectangle(150, y, barWidth, barHeight)
		dc.Fill()

		// 绘制数值
		dc.SetColor(color.Black)
		dc.DrawStringAnchored(fmt.Sprintf("%.1f GB", d.Value), 150+barWidth+10, y+barHeight/2, 0, 0.5)
	}

	// 保存到缓冲区
	var buf bytes.Buffer
	dc.EncodePNG(&buf)

	// 可选的保存到文件
	if err := os.WriteFile("bar_chart.png", buf.Bytes(), 0644); err != nil {
		fmt.Println("Error saving file:", err)
	}
}
